package com.ly.Interceptor;

import com.ly.utils.UserHolder;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 校验登录状态拦截器
 * 上一层的 RefreshTokenInterceptor 已经把已登录用户的DTO放在了ThreadLocal了
 * 对需要登录才能查看的路径进行拦截
 */
public class LoginInterceptor implements HandlerInterceptor {

    /**
     * 在业务处理器处理请求之前被调用，可以进行登录拦截，编码处理、安全控制、权限校验等处理；
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 根据 RefreshTokenInterceptor 是否在 ThreadLocal 中放入userDTO，判断当前用户是否已登录
        if(UserHolder.getUser() == null){
            // 没有登录，需要拦截
            response.setStatus(401);
            return false;
        }

        // 已登录，放行
        return true;
    }


    /**
     * 请求完成、视图渲染后执行，释放资源
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 移除用户，避免内存泄露(threadlocal实质是存到线程的map中了，键是弱引用，用完就回收了，但是值是强引用。没有办法处理，就导致在内存中一直存着，不易销毁)
        UserHolder.removeUser();
    }
}
